import Vue from 'vue'
import commonConfig from './config';

let mapDict = new Map();
// 添加取消令牌的Map
const cancelTokenMap = new Map();
export default function ({
	app,
	$axios,
	redirect,
	store
}) {
	
	$axios.defaults.baseURL = Vue.prototype.baseURL
	$axios.onRequest(config => {
		let XRequestID="";

		//  ------------------------  暂时注释 ---------------------------------
		// // 检查并取消重复请求
		// if(cancelTokenMap.has(config.url)) {
		// 	const cancel = cancelTokenMap.get(config.url);
		// 	cancel(`取消重复请求: ${config.url}`);
		// 	cancelTokenMap.delete(config.url);
		// }
		
		// 创建新的取消令牌
		// const source = $axios.CancelToken.source();
		// config.cancelToken = source.token;
		// cancelTokenMap.set(config.url, source.cancel);
		
		// if(mapDict.has(config.url)){
		// 	// Vue.prototype.$message.error('请不要重复提交')
		// 	console.log('请不要重复提交',config.url)
		// 	XRequestID=mapDict.get(config.url);
		// 	return
		// }else{
		// 	XRequestID = generateGuid();
		// 	mapDict.set(config.url,XRequestID);
		// }

		store.commit('setWebLoading', true)
		$axios.setHeader('Terminal', 'PC')
		$axios.setHeader('operatorid', commonConfig.operatorid)
		$axios.setHeader('UserType', localStorage.getItem('UserType'))
		$axios.setHeader('X-Request-ID', XRequestID)
		
		if (localStorage.getItem('lifeData')) {
			// console.log('authorization:',JSON.parse(localStorage.getItem('lifeData')).authorization)
			$axios.setHeader('Authorization', JSON.parse(localStorage.getItem('lifeData')).authorization)
			// $axios.setHeader('operatorid', JSON.parse(localStorage.getItem('lifeData')).operatorid)
			// 加盟商登录时添加加盟商id
			// let franchiseId = localStorage.getItem('franchiseid');
			// if(franchiseId && localStorage.getItem('useTemplate') == 1){
			// 	if (config.method?.toLowerCase() === 'get') {
			// 		// GET请求：添加到params
			// 		if (config.params) {
			// 			config.params = { ...config.params, franchiseId: franchiseId };
			// 		} else {
			// 			config.params = { franchiseId: franchiseId };
			// 		}
			// 	} else {
			// 		// POST/PUT/PATCH等：添加到data
			// 		if (config.data) {
			// 			config.data = { ...config.data, franchiseId: franchiseId };
			// 		} else {
			// 			config.data = { franchiseId: franchiseId };
			// 		}
			// 	}
			// }

			// OperatorId与UserType必须要同时传
			// if (JSON.parse(localStorage.getItem('lifeData'))?.operatorid) {
				// $axios.setHeader('OperatorId', JSON.parse(localStorage.getItem('lifeData')).operatorid)
				// const operatorId = JSON.parse(localStorage.getItem('lifeData')).operatorid;
				// // 判断是否为目标路径，公共接口参数需要传operatorid
				// const targetPaths = ['Waste/Type/List', 'Waste/product/List','Waste/Price/Overview','Waste/Price/OverviewDownload'];
				// const isTargetPath = targetPaths.some(path => config.url.includes(path));
				// // console.log(isTargetPath,config.url)
				// if (isTargetPath) {
				// 	// 仅在目标路径下添加参数
				// 	if (config.method?.toLowerCase() === 'get') {
				// 		// GET请求：添加到params
				// 		if (config.params) {
				// 			config.params = { ...config.params, operatorid: operatorId };
				// 		} else {
				// 			config.params = { operatorid: operatorId };
				// 		}
				// 	} else {
				// 		// POST/PUT/PATCH等：添加到data
				// 		if (config.data) {
				// 			config.data = { ...config.data, operatorid: operatorId };
				// 		} else {
				// 			config.data = { operatorid: operatorId };
				// 		}
				// 	}
				// }

				// 加盟商登录时添加加盟商id
				// let franchiseId = localStorage.getItem('franchiseid');
				// if(franchiseId && localStorage.getItem('useTemplate') == 1){
				// 	if (config.method?.toLowerCase() === 'get') {
				// 		// GET请求：添加到params
				// 		if (config.params) {
				// 			config.params = { ...config.params, franchiseId: franchiseId };
				// 		} else {
				// 			config.params = { franchiseId: franchiseId };
				// 		}
				// 	} else {
				// 		// POST/PUT/PATCH等：添加到data
				// 		if (config.data) {
				// 			config.data = { ...config.data, franchiseId: franchiseId };
				// 		} else {
				// 			config.data = { franchiseId: franchiseId };
				// 		}
				// 	}
				// }
			// }
		}
	})

	$axios.onResponse((res) => { 
		// // 清理请求记录
		// if (cancelTokenMap.has(res.config.url)) {
		// 	cancelTokenMap.delete(res.config.url);
		// }
		// if (mapDict.has(res.config.url)) {
		// 	mapDict.delete(res.config.url);
		// }

		store.commit('setWebLoading', false)
		let code = parseInt(res.request && res.request.status)
		if (code == 200) {
			// console.log(res)
			let msg = res.data.msg
			switch (res.data.status) {
				case 0:
					if (res.data.token) {
						let getToken = res.data.token

						let lifeData = {
							authorization: getToken.token.token,
							userdetail: getToken.userdetail
						}

						store.dispatch('setInitData', lifeData)
					}

					break;
				case 1:
					if (typeof (msg) == 'object') {
						for (let k in msg) {
							Vue.prototype.$message.error(msg[k]);
						}
					} else {
						Vue.prototype.$message.error(msg)
					}
					return Promise.reject()
					break;
				case 2:
					// Vue.prototype.$message.error('登录异常或令牌过期，请重新登录')
					localStorage.clear()
					redirect('/login?status=2')
					break;
				case 3:
					Vue.prototype.$message.error('您没有权限操作')
					// redirect('/login/')
					return Promise.reject()
					break;
				case 4:
					Vue.prototype.$message.error(msg)
					// redirect('/login/')
					return Promise.reject()
					break;
				default:
				// return res.data
			}
			let datas = {}
			try {
				datas = res.data.datas
				datas.msg = res.data.msg
			}
			catch (err) {
				datas = res.data
				if (res.data.msg) {
					datas.msg = res.data.msg
				}
			}

			return datas
		}
	})

	$axios.onError(error => {
		// // 清理请求记录
		// if (error.config && cancelTokenMap.has(error.config.url)) {
		// 	cancelTokenMap.delete(error.config.url);
		// }
		// if (error.config && mapDict.has(error.config.url)) {
		// 	mapDict.delete(error.config.url);
		// }
		
		// // 忽略取消请求的错误
		// if ($axios.isCancel(error)) {
		// 	return new Promise(() => {}); // 返回空Promise避免链式错误
		// }

		store.commit('setWebLoading', false)
		if (!error) {
			return
		}
		let code = parseInt(error.response && error.response.status)

		switch (code) {
			case 400:
				let err = error.response.data.errors;
				if (err) {
					if (typeof (err) == 'object') {
						for (let k in err) {
							if (err[k].length >= 1) {
								setTimeout(() => {
									Vue.prototype.$message.error(err[k][0]);
								}, 500)
							} else {
								Vue.prototype.$message.error(err[k][0]);
							}
						}
					} else {
						Vue.prototype.$message.error(err)
					}
				}
				break;
			case 404:
				Vue.prototype.$message.error('请求资源未找到（404）');
				break;
			case 500:
				Vue.prototype.$message.error('服务器错误（500）');
				break;
			case 502:
				Vue.prototype.$message.error('网络错误（502）');
				break;
			case 503:
				Vue.prototype.$message.error('服务不可用（503）');
				break;
			case 504:
				Vue.prototype.$message.error('网络超时（504）');
				break;
			default:
				console.log(error)
			// Vue.prototype.$message.error('未知错误')
		}
	})
}

function generateGuid() {
	return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
	  var r = Math.random() * 16 | 0,
		  v = c === 'x' ? r : (r & 0x3 | 0x8);
	  return v.toString(16);
	});
}